স্ট্রাকচার (Structure) এবং ইউনিয়ন (Union) হলো C++ প্রোগ্রামিং ভাষায় ব্যবহৃত দুটি ডেটা স্ট্রাকচার, যা একাধিক ভিন্ন ধরনের ডেটা একত্রে সংরক্ষণ করতে ব্যবহৃত হয়। তবে এদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে, যা তাদের ব্যবহারের উদ্দেশ্য এবং কার্যকারিতা পৃথক করে।
স্ট্রাকচার হলো একটি ডেটা স্ট্রাকচার, যা বিভিন্ন ধরনের ডেটা মেম্বার ধারণ করতে পারে। স্ট্রাকচার ডেটা মেম্বারগুলোকে তাদের নিজস্ব মেমোরি লোকেশন বরাদ্দ করে, ফলে প্রতিটি মেম্বারের নিজস্ব মেমোরি থাকে।
struct StructureName {
data_type member1;
data_type member2;
// অন্যান্য মেম্বার
};
#include <iostream>
using namespace std;
// Student নামক একটি স্ট্রাকচার ঘোষণা করা
struct Student {
int id;
string name;
float marks;
};
int main() {
// Student স্ট্রাকচারের একটি অবজেক্ট তৈরি করা
Student student1;
// মেম্বার সেট করা
student1.id = 101;
student1.name = "John";
student1.marks = 85.5;
// মেম্বার প্রিন্ট করা
cout << "ID: " << student1.id << endl;
cout << "Name: " << student1.name << endl;
cout << "Marks: " << student1.marks << endl;
return 0;
}
বর্ণনা:
Student
নামে একটি স্ট্রাকচার তৈরি করা হয়েছে, যার মধ্যে id
, name
, এবং marks
নামে তিনটি মেম্বার রয়েছে।id
, name
, এবং marks
এর ভিন্ন মান ধারণ করা সম্ভব।ইউনিয়ন হলো এমন একটি ডেটা স্ট্রাকচার, যা একাধিক মেম্বার ধারণ করতে পারে তবে একই সময়ে শুধুমাত্র একটি মেম্বারকে মেমোরি বরাদ্দ করে। অর্থাৎ, ইউনিয়নের মধ্যে সবচেয়ে বড় মেম্বারের জন্য পর্যাপ্ত মেমোরি বরাদ্দ হয় এবং সব মেম্বার সেই মেমোরি ভাগাভাগি করে ব্যবহার করে।
union UnionName {
data_type member1;
data_type member2;
// অন্যান্য মেম্বার
};
#include <iostream>
using namespace std;
// Data নামক একটি ইউনিয়ন ঘোষণা করা
union Data {
int intValue;
float floatValue;
char charValue;
};
int main() {
// Data ইউনিয়নের একটি অবজেক্ট তৈরি করা
Data data;
// মেম্বার সেট এবং প্রিন্ট করা
data.intValue = 10;
cout << "Integer Value: " << data.intValue << endl;
data.floatValue = 3.14;
cout << "Float Value: " << data.floatValue << endl;
data.charValue = 'A';
cout << "Char Value: " << data.charValue << endl;
return 0;
}
বর্ণনা:
Data
নামে একটি ইউনিয়ন তৈরি করা হয়েছে, যার মধ্যে intValue
, floatValue
, এবং charValue
নামে তিনটি মেম্বার রয়েছে।বৈশিষ্ট্য | স্ট্রাকচার (Structure) | ইউনিয়ন (Union) |
---|---|---|
মেম্বার মেমোরি | প্রতিটি মেম্বারের নিজস্ব মেমোরি বরাদ্দ থাকে | সব মেম্বার একটি মেমোরি ভাগাভাগি করে |
আকার | সব মেম্বারের মেমোরি যোগফলের সমান | সবচেয়ে বড় মেম্বারের মেমোরির সমান |
মেম্বার অ্যাক্সেস | একসঙ্গে একাধিক মেম্বার অ্যাক্সেস করা যায় | এক সময়ে একটি মাত্র মেম্বার অ্যাক্সেস করা যায় |
মেমোরি ব্যবহারের উদ্দেশ্য | বেশি মেমোরি বরাদ্দকৃত | কম মেমোরি বরাদ্দকৃত |
স্ট্রাকচার (Structure) C++ এর একটি ডেটা স্ট্রাকচার, যা বিভিন্ন ডেটা টাইপের ডেটা মেম্বার বা ভ্যারিয়েবলকে একত্রে সংরক্ষণ করতে ব্যবহৃত হয়। স্ট্রাকচার ব্যবহার করে একটি ডেটা টাইপের মধ্যে একাধিক ডেটা মেম্বারকে গ্রুপ করা যায়, যা কোডিংয়ে আরও সুবিধা প্রদান করে।
C++ এ struct
কীওয়ার্ড ব্যবহার করে স্ট্রাকচার ঘোষণা করা হয়। স্ট্রাকচার ঘোষণার মধ্যে বিভিন্ন ডেটা মেম্বার (যেমন ইন্টিজার, ফ্লোট, স্ট্রিং ইত্যাদি) সংজ্ঞায়িত করা হয়।
#include <iostream>
using namespace std;
// স্ট্রাকচার ঘোষণা
struct Person {
string name;
int age;
float height;
};
int main() {
// স্ট্রাকচার অবজেক্ট তৈরি
Person person1;
// ডেটা মেম্বার অ্যাসাইন করা
person1.name = "John Doe";
person1.age = 25;
person1.height = 5.9;
// ডেটা মেম্বার প্রদর্শন
cout << "Name: " << person1.name << endl;
cout << "Age: " << person1.age << endl;
cout << "Height: " << person1.height << endl;
return 0;
}
বর্ণনা:
Person
নামে একটি স্ট্রাকচার ঘোষণা করা হয়েছে, যাতে name
, age
, এবং height
নামে তিনটি ডেটা মেম্বার রয়েছে।person1
নামে Person
স্ট্রাকচারের একটি অবজেক্ট তৈরি করা হয়েছে এবং এতে মান অ্যাসাইন করে প্রদর্শন করা হয়েছে।স্ট্রাকচার ব্যবহার করে বিভিন্ন ডেটা টাইপ একসাথে সংরক্ষণ এবং পরিচালনা করা যায়। এটি বিশেষ করে যখন একাধিক ডেটা টাইপের ডেটা একত্রে সংরক্ষণ করতে হয় তখন কার্যকরী।
#include <iostream>
using namespace std;
struct Book {
string title;
string author;
int pages;
};
int main() {
Book book1 = {"The Catcher in the Rye", "J.D. Salinger", 277};
Book book2 = {"To Kill a Mockingbird", "Harper Lee", 324};
cout << "Book 1 Title: " << book1.title << ", Author: " << book1.author << ", Pages: " << book1.pages << endl;
cout << "Book 2 Title: " << book2.title << ", Author: " << book2.author << ", Pages: " << book2.pages << endl;
return 0;
}
বর্ণনা:
Book
নামের একটি স্ট্রাকচার তৈরি করা হয়েছে, যা title
, author
, এবং pages
ডেটা মেম্বার ধারণ করে।book1
এবং book2
নামে দুটি স্ট্রাকচার অবজেক্ট তৈরি করা হয়েছে এবং তাদের মান প্রদর্শন করা হয়েছে।স্ট্রাকচারকে প্যারামিটার হিসেবে ফাংশনে পাস করা যায়। এটি পাস-বাই-ভ্যালু এবং পাস-বাই-রেফারেন্স উভয়ভাবেই করা যেতে পারে।
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
void displayPerson(Person p) {
cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
int main() {
Person person1 = {"Alice", 30};
displayPerson(person1);
return 0;
}
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
void modifyPerson(Person &p) {
p.age += 1; // বয়স এক বছর বৃদ্ধি করা
}
int main() {
Person person1 = {"Bob", 40};
cout << "Before modification: " << person1.age << endl;
modifyPerson(person1);
cout << "After modification: " << person1.age << endl;
return 0;
}
বর্ণনা:
Person
অবজেক্ট displayPerson()
ফাংশনে পাস করা হয়েছে এবং কেবলমাত্র এর কপি ব্যবহার করা হয়েছে।modifyPerson()
ফাংশনে Person
অবজেক্ট রেফারেন্স হিসেবে পাস করা হয়েছে এবং এর মান পরিবর্তন করা হয়েছে।স্ট্রাকচারের মধ্যে অ্যারে ব্যবহার করে একাধিক মান সংরক্ষণ করা যায়।
#include <iostream>
using namespace std;
struct Student {
string name;
int marks[5];
};
int main() {
Student student1 = {"Alice", {85, 90, 78, 88, 92}};
cout << "Student Name: " << student1.name << endl;
cout << "Marks: ";
for (int i = 0; i < 5; i++) {
cout << student1.marks[i] << " ";
}
cout << endl;
return 0;
}
বর্ণনা:
Student
স্ট্রাকচারের মধ্যে marks
নামে একটি ইন্টিজার অ্যারে ব্যবহার করা হয়েছে, যা ৫টি বিষয়ের মার্ক্স ধারণ করে।১. ডেটা গ্রুপিং: বিভিন্ন ধরনের ডেটা একত্রে সংরক্ষণ করা যায়। ২. সহজ ডেটা মডেলিং: একই ধরনের একাধিক অবজেক্ট তৈরি করা যায়, যা রিয়েল-ওয়ার্ল্ড এন্টিটির মডেলিংয়ে সহায়ক। ৩. সহজ ব্যবহার: সহজেই ফাংশনে পাস করা যায় এবং প্রোগ্রামকে আরও পরিষ্কার ও সংগঠিত রাখে।
বৈশিষ্ট্য | স্ট্রাকচার | ক্লাস |
---|---|---|
অ্যাক্সেস স্পেসিফায়ার | ডিফল্টভাবে public | ডিফল্টভাবে private |
ইনহেরিটেন্স | সাধারণত ইনহেরিটেন্স সমর্থন করে না | ইনহেরিটেন্স সমর্থন করে |
মেম্বার ফাংশন | স্ট্রাকচারে মেম্বার ফাংশন থাকতে পারে | ক্লাসে মেম্বার ফাংশন থাকে |
স্ট্রাকচার C++ এ ডেটা সংরক্ষণ ও সংগঠিত করার একটি কার্যকর উপায়, যা বড় প্রোগ্রামিং প্রকল্পে ডেটা ম্যানেজমেন্ট সহজ করে।
ইউনিয়ন (Union) হলো C++ এর একটি ডেটা স্ট্রাকচার, যা একাধিক ডেটা মেম্বার ধারণ করতে পারে, তবে একই সময়ে কেবলমাত্র একটি মেম্বারের জন্য মেমোরি বরাদ্দ করা হয়। অর্থাৎ, একটি ইউনিয়ন একাধিক ধরনের ডেটা রাখার ক্ষমতা রাখে, কিন্তু একই সময়ে শুধুমাত্র একটি মেম্বার সক্রিয় থাকে। ইউনিয়নের প্রতিটি মেম্বার একই মেমোরি লোকেশন ভাগ করে নেয়, ফলে সর্বশেষ সেট করা মানই ইউনিয়নের মধ্যে সংরক্ষিত থাকে।
union UnionName {
data_type member1;
data_type member2;
// অন্যান্য মেম্বার
};
#include <iostream>
using namespace std;
// Data নামক একটি ইউনিয়ন ঘোষণা করা
union Data {
int intValue;
float floatValue;
char charValue;
};
int main() {
// Data ইউনিয়নের একটি অবজেক্ট তৈরি করা
Data data;
// মেম্বার সেট এবং প্রিন্ট করা
data.intValue = 10;
cout << "Integer Value: " << data.intValue << endl;
data.floatValue = 3.14;
cout << "Float Value: " << data.floatValue << endl;
data.charValue = 'A';
cout << "Char Value: " << data.charValue << endl;
return 0;
}
আউটপুট:
Integer Value: 10
Float Value: 3.14
Char Value: A
বর্ণনা:
Data
নামে একটি ইউনিয়ন তৈরি করা হয়েছে, যার মধ্যে intValue
, floatValue
, এবং charValue
নামে তিনটি মেম্বার রয়েছে।ইউনিয়নের আকার তার সবচেয়ে বড় মেম্বারের আকারের সমান।
#include <iostream>
using namespace std;
union Data {
int intValue;
float floatValue;
double doubleValue;
};
int main() {
cout << "Size of int: " << sizeof(int) << endl;
cout << "Size of float: " << sizeof(float) << endl;
cout << "Size of double: " << sizeof(double) << endl;
cout << "Size of union Data: " << sizeof(Data) << endl;
return 0;
}
আউটপুট:
Size of int: 4
Size of float: 4
Size of double: 8
Size of union Data: 8
বর্ণনা:
Data
ইউনিয়নে intValue
, floatValue
, এবং doubleValue
নামে তিনটি মেম্বার রয়েছে।Data
ইউনিয়নের আকার হলো তার সবচেয়ে বড় মেম্বার doubleValue
এর আকারের সমান, অর্থাৎ ৮ বাইট।#include <iostream>
using namespace std;
union Data {
int intValue;
float floatValue;
};
struct Container {
Data data;
bool isInt; // true হলে intValue ধারন করছে, false হলে floatValue ধারন করছে
};
int main() {
Container container;
container.data.intValue = 50;
container.isInt = true;
if (container.isInt) {
cout << "Integer Value: " << container.data.intValue << endl;
} else {
cout << "Float Value: " << container.data.floatValue << endl;
}
container.data.floatValue = 3.5;
container.isInt = false;
if (container.isInt) {
cout << "Integer Value: " << container.data.intValue << endl;
} else {
cout << "Float Value: " << container.data.floatValue << endl;
}
return 0;
}
বর্ণনা:
Container
নামের একটি স্ট্রাকচার ব্যবহার করে ডেটা টাইপ শনাক্ত করা হয়েছে, যাতে ইউনিয়নের intValue
অথবা floatValue
কোনটি বর্তমানে অ্যাক্সেসযোগ্য তা জানা যায়।isInt
ফ্ল্যাগ ব্যবহার করে নির্ধারণ করা হয়েছে যে data
ইউনিয়নের মধ্যে বর্তমানে intValue
সংরক্ষিত কিনা।ইউনিয়ন বিশেষ ক্ষেত্রে কার্যকরী এবং মেমোরি ব্যবহারে গুরুত্বপূর্ণ ভূমিকা পালন করে।
C++ এ স্ট্রাকচার এবং পয়েন্টার একসাথে ব্যবহার করে স্ট্রাকচারের ডেটা মেম্বারে সহজে অ্যাক্সেস করা যায়। স্ট্রাকচারের অবজেক্টের ঠিকানা ধারণ করতে পয়েন্টার ব্যবহার করা যেতে পারে, এবং সেই ঠিকানা ব্যবহার করে স্ট্রাকচারের সদস্যদের অ্যাক্সেস করা যায়।
স্ট্রাকচারের পয়েন্টার ঘোষণা করার সময় struct
কিওয়ার্ডের সাথে পয়েন্টার চিহ্ন *
ব্যবহার করা হয়। উদাহরণস্বরূপ:
struct Person {
string name;
int age;
};
Person *ptr; // Person স্ট্রাকচারের একটি পয়েন্টার
স্ট্রাকচারের পয়েন্টার ব্যবহার করে স্ট্রাকচারের ডেটা মেম্বার অ্যাক্সেস করার জন্য ->
(arrow) অপারেটর ব্যবহার করা হয়।
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
Person person1 = {"Alice", 25}; // একটি স্ট্রাকচার অবজেক্ট তৈরি করা
Person *ptr = &person1; // person1 এর ঠিকানা ptr এ রাখা হলো
// পয়েন্টার ব্যবহার করে স্ট্রাকচারের মেম্বার অ্যাক্সেস করা
cout << "Name: " << ptr->name << endl; // Output: Name: Alice
cout << "Age: " << ptr->age << endl; // Output: Age: 25
// পয়েন্টার ব্যবহার করে মান পরিবর্তন করা
ptr->age = 26;
cout << "Updated Age: " << person1.age << endl; // Output: Updated Age: 26
return 0;
}
বর্ণনা:
person1
নামের একটি Person
স্ট্রাকচারের অবজেক্ট তৈরি করা হয়েছে, এবং ptr
নামের একটি পয়েন্টার person1
এর ঠিকানা ধরে রেখেছে।ptr->name
এবং ptr->age
ব্যবহার করে name
এবং age
মেম্বার অ্যাক্সেস করা হয়েছে।age
মেম্বারের মান পরিবর্তন করা হয়েছে।C++ এ new
অপারেটর ব্যবহার করে স্ট্রাকচারের জন্য ডাইনামিক্যালি মেমোরি বরাদ্দ করা যায় এবং পয়েন্টারের মাধ্যমে সেই মেম্বারগুলিকে অ্যাক্সেস করা যায়।
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
// ডাইনামিক্যালি Person স্ট্রাকচারের মেমোরি বরাদ্দ
Person *ptr = new Person;
// মেম্বার ফিল্ডে মান অ্যাসাইন করা
ptr->name = "Bob";
ptr->age = 30;
// মান প্রদর্শন করা
cout << "Name: " << ptr->name << endl; // Output: Name: Bob
cout << "Age: " << ptr->age << endl; // Output: Age: 30
// মেমোরি মুক্ত করা
delete ptr;
return 0;
}
বর্ণনা:
new
অপারেটর ব্যবহার করে Person
স্ট্রাকচারের জন্য ডাইনামিক্যালি মেমোরি বরাদ্দ করা হয়েছে এবং ptr
নামের একটি পয়েন্টার সেটির ঠিকানা ধারণ করছে।ptr->name
এবং ptr->age
ব্যবহার করে মেম্বার ফিল্ডে মান অ্যাসাইন করা হয়েছে এবং প্রদর্শন করা হয়েছে।delete
অপারেটর ব্যবহার করে ডাইনামিক্যালি বরাদ্দকৃত মেমোরি মুক্ত করা হয়েছে।পয়েন্টার ব্যবহার করে স্ট্রাকচারের অ্যারে তৈরি করা যায় এবং সেই অ্যারের প্রতিটি উপাদানে অ্যাক্সেস করা সম্ভব।
#include <iostream>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
// 3টি স্ট্রাকচার অবজেক্টের জন্য মেমোরি বরাদ্দ
Person *persons = new Person[3];
// প্রতিটি অবজেক্টের মেম্বার সেট করা
persons[0].name = "Alice";
persons[0].age = 25;
persons[1].name = "Bob";
persons[1].age = 30;
persons[2].name = "Charlie";
persons[2].age = 35;
// অবজেক্টের তথ্য প্রদর্শন
for (int i = 0; i < 3; i++) {
cout << "Person " << i + 1 << " - Name: " << persons[i].name << ", Age: " << persons[i].age << endl;
}
// মেমোরি মুক্ত করা
delete[] persons;
return 0;
}
বর্ণনা:
Person
স্ট্রাকচারের একটি অ্যারে ডাইনামিক্যালি তৈরি করা হয়েছে, যার আকার ৩।name
এবং age
মেম্বারে আলাদা আলাদা মান সেট করা হয়েছে।for
লুপ ব্যবহার করে প্রতিটি অবজেক্টের তথ্য প্রদর্শন করা হয়েছে।delete[]
অপারেটর ব্যবহার করে ডাইনামিক্যালি বরাদ্দকৃত মেমোরি মুক্ত করা হয়েছে।স্ট্রাকচারের সাথে পয়েন্টার ব্যবহার প্রোগ্রামিংয়ে মেমোরি ব্যবস্থাপনা এবং ডেটা ম্যানেজমেন্টকে সহজতর করে, যা বড় প্রোগ্রামে কার্যকর।
common.read_more